import { lazyReportBatch } from '../report.js';

// 当请求失败（例如，因为请求 URL 的格式错误或网络错误）时，fetch() 的 promise 才会被拒绝。
// fetch() 的 promise 不会因为服务器响应表示错误的 HTTP 状态码（404、504，等）而被拒绝。
// 因此，then() 处理器必须检查 Response.ok 和/或 Response.status 属性。
const originalFetch = window.fetch;
function overwriteFetch() {
    window.fetch = function newFetch(url,config) {
        const startTime = Date.now();
        const reportData = {
            type:'performance',
            subType:'fetch',
            url,
            startTime,
            method:config.method,

        }
        return originalFetch(url,config).then((res) => {
            const endTime = Date.now();
            reportData.endTime = endTime;
            reportData.duration = endTime - startTime;
            const data = res.clone();// 创建一个 Response 对象的克隆
            reportData.status = data.status;// 状态码
            reportData.success = data.ok;// 布尔值，表明响应是否成功（状态码在 200-299 范围内）
            // TODO:上报数据
            lazyReportBatch(reportData);
            // 返回原始的响应（return res），以便调用 fetch 的代码可以继续处理响应。
            return res;
        }).catch((err) => {
            const endTime = Date.now();
            reportData.endTime = endTime;
            reportData.duration = endTime - startTime;
            reportData.status = 0;
            reportData.success = false;
            // TODO:上报数据
            lazyReportBatch(reportData);
            // 重新抛出错误（throw err），以便调用 fetch 的代码可以处理错误。
            throw err;

        })

    }
}
export default function fetch() {
    overwriteFetch();
};